package Colonia;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import Clases.*;


public class Hormiga 
{
	private List<Vertice> caminoVertices;
	private List<Arista> caminoAristas;
	private Solucion solucion;
	
	public Hormiga(Vertice inicial,Solucion solucion)
	{
		caminoVertices = new ArrayList<Vertice>();
		caminoAristas = new ArrayList<Arista>();
		caminoVertices.add(inicial);
		this.solucion = solucion;
	}
	
	public Vertice getVerticeActual()
	{
		return caminoVertices.get(caminoVertices.size() - 1);
	}

	public void seleccionaVertice(Grafo grafo) 
	{
		List<Arista> lista = grafo.getAristasAdyacentes(this.getVerticeActual());
		
		Arista seleccionada = seleccionaArista(lista);
		
		caminoAristas.add(seleccionada);
		caminoVertices.add(seleccionada.getDestino());
		if(seleccionada.getDestino().getTarea() != null)
			solucion.add(seleccionada.getDestino().getTarea(),seleccionada.getDestino().getUsuario());
	}
	
	private Arista seleccionaArista(List<Arista> lista) 
	{
		int totalFeromonas = 0;
		for(Arista arista : lista)
		{
			totalFeromonas += Math.round(arista.getFeromona());
		}
		
		Arista ret = null;
		while(ret == null)
		{
			Random r = new Random();
			int ruleta = r.nextInt(totalFeromonas);
			int contador = 0;
			for(Arista arista : lista)
			{
				contador += Math.round(arista.getFeromona());
				if(ruleta < contador)
				{
					if(arista.getDestino().getUsuario() != null)
					{
						// Cuidado con disponibilidad negativa
						int disponibilidad = 0;
						for(Usuario usuario : solucion.getAsignacion().values())
						{
							if(usuario.equals(arista.getDestino().getUsuario()))
							{
								disponibilidad++;
							}
						}
						if(disponibilidad < arista.getDestino().getUsuario().getDisponibilidad())
						{
							ret = arista;
						}
					}
					else
					{
						ret = arista;
					}
					break;
				}
			}
		}
		
		return ret;
	}

	public String toString()
	{
		String cad = "" + caminoVertices.toString() + "\n" + caminoAristas.toString();
		
		return cad;
	}

	public Solucion getSolucion() 
	{
		return solucion;
	}

	public List<Arista> getCaminoAristas() 
	{
		return caminoAristas;
	}
}
